<?php
// 1、form表单中使用type是file的input，form标签中enctype="multipart/form-data"
// 2、接收用$_FILES系统变量
// 3、文件大小验证
// 4、文件类型验证
// 5、文件夹是否存在

class upload{
	public $dir; //上传路径
	public $maxSize; //最大上传限制
	public $types;//允许上传的文件类型
	public $newfile;

	public function __construct($dir='upload',$maxSize=209700000,$types=array()){
		$this->dir=$dir;
		$this->maxSize=$maxSize;

		if($types){
			$this->types=$types;
		}else{
			$this->types=array('image/jpeg','image/png');
		}
	}

	//上传单个文件
	public function uploadOne($file){
		if($file['error']!==0){
			return array('status'=>0,'msg'=>$file['name'].$this->errorMsg($file['error']));
		}

		if(!$this->vaDir()){
			return array('status'=>0,'msg'=>$file['name'].'上传文件夹错误');
		}
		if($this->vaSize($file['size'])&&$this->vaType($file['type'])){
			$newFile = $this->getNewName($file);
			if(move_uploaded_file($file['tmp_name'], $newFile)){
				return array('status'=>1,'file'=>$this->newfile,'msg'=>$file['name'].'上传成功');
			}else{
				return array('status'=>0,'msg'=>$file['name'].'文件上传失败');
			}
		}else{
			return array('status'=>0,'msg'=>$file['name'].'文件过大或者类型不正确');
		}
	}

	//批量上传
	public function uploadAll($files=array()){
		if(empty($files)){
			$files = $_FILES;
		}
		$result=array();
		foreach ($files as $file) {
			$result[]=$this->uploadOne($file);
		}
		return $result;
	}

	//验证文件夹是否存在
	private function vaDir(){
		if(is_dir($this->dir)){
			return true;
		}else{
			return false;
		}
	}

	//验证大小
	private function vaSize($size){
		if($size>$this->maxSize){
			return false;
		}else{
			return true;
		}
	}
	//验证类型
	private function vaType($type){
		if(in_array($type,$this->types)){
			return true;
		}else{
			return false;
		}

	}

	//生成新文件名
	private function getNewName($file){
		$path=pathinfo($file['tmp_name']);
		$name=$path['filename'];
		$path=pathinfo($file['name']);
		$ext=$path['extension'];
		$this->newfile=$name.'.'.$ext;
		return $this->dir.'/'.$this->newfile;
	}
	//error判定
	private function errorMsg($error){
		switch ($error) {
			case 1:
				$msg = '文件大小超出服务器尺寸';
				break;
			case 2:
				$msg = '文件大小超出浏览器限制';
				break;
			case 3:
				$msg = '文件只上传了部分';
				break;
			case 4:
				$msg = '文件没有上传';
				break;
			case 5:
				$msg = '服务器临时文件丢失';
				break;
			case 6:
				$msg = '文件写入到临时文件出错';
				break;
			default:
				$msg = '未知错误';
				break;
		}
		return $msg;
	}
}